#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>

#define FILE_NAME(nums) "test"#nums

int main()
{
    printf("stdin->fd:%d\n",stdin->_fileno);
    printf("stdout->fd:%d\n",stdout->_fileno);
    printf("stderr->fd:%d\n",stderr->_fileno);
    return 0;
}




//将宏参数转化位字符串，两个字符串链接在一起
//
//int main()
//{
//    int fd1 = open(FILE_NAME(1), O_WRONLY| O_CREAT , 0666);
//    int fd2 = open(FILE_NAME(2), O_WRONLY| O_CREAT , 0666);
//    int fd3 = open(FILE_NAME(3), O_WRONLY| O_CREAT , 0666);
//    int fd4 = open(FILE_NAME(4), O_WRONLY| O_CREAT , 0666);
//    printf("fd1:%d\n",fd1);
//    printf("fd2:%d\n",fd2);
//    printf("fd3:%d\n",fd3);
//    printf("fd4:%d\n",fd4);
//    close(fd1);
//    close(fd2);
//    close(fd3);
//    close(fd4);
//    return 0;
//}
//
//int main()
//{
//    //write(0,"zhang\n", 6);
//
//    char buf[1024];
//    ssize_t num = read(0, buf,sizeof(buf));
//
//    if(num>0)
//    {
//        buf[num]=0;//在末尾添加一个 '\0'
//        write(1,buf,strlen(buf));
//        write(2,buf,strlen(buf));
//    }
//
//    return 0;
//}
//

//
//int main()
//{
//    int fd = open("./test.txt", O_RDONLY);
//    //以读取的方式打开
//    if(fd == -1)
//    {
//        perror("open:");
//        exit(1);
//    }
//    char buffer[1024];
//    ssize_t ret = read(fd, buffer,sizeof(buffer)-1);
//    if(ret >0)
//    {
//        //读取成功
//        buffer[ret] = '\0';
//        //系统中字符串不是以'\0'结尾的，
//        //以'\0'结尾只是C语言行为，不是系统行为。
//    }
//    printf("ret: %ld\n",ret);
//    printf("%s\n",buffer);
//    printf("fd:%d\n",fd);
//    close(fd);
//    return 0;
//}
//

//int main()
//{
//    umask(0000);//定义自己的文件掩码umask
//    //int fd = open("./test.txt", O_WRONLY);//以只写的方式打开
//    int fd = open("./test.txt", O_WRONLY|O_CREAT|O_APPEND, 0666); //mode&~umask 就是文件创建后的权限。
//    //O_CREAT:如果文件不存在自动创建,需要指明创建时文件的权限mode
//    //默认使用系统提供的umask ，也可以自己指定。
//    // O_WRONLY：以只写的方式打开
//    // O_TRUNC：清空文件数据
//    if(fd == -1)
//    {
//        perror("open");
//        exit(1);
//    }
//    printf("fd: %d\n",fd);
//
//    int cnt =5;
//    char buffer[64];
//    while(cnt)
//    {
//        sprintf(buffer, "%s:%d\n","aaaaaaa",cnt--);
//        write(fd, (void*)buffer, strlen(buffer));
//        //向文件当中写入的时候count要不要加1；
//        //不需要加1，字符串以'\0'结尾是C语言行为，不是系统行为。
//        //将字符串写入文件的时候不需要写入'\0';
//    }
//
//    close(fd);
//
//    return 0;
//}
//



//
//int main()
//{
//    FILE* fp = fopen("./test.txt","w+");
//    if(fp == NULL) {
//        perror("fopen:") ;
//        exit(1);
//    }
//
//    const char* str = "zhangxuefeng,20000\n";
//    fprintf(fp, "%s,%d\n","zhangxuefeng",10000);
//    fputs(str, fp);
//
//    fclose(fp);
//    return 0;
//}
//int main()
//{
//
//    FILE* fp = fopen("./test.txt","r");
//    if(fp == NULL) {
//        perror("fopen:") ;
//        exit(1);
//    }
//    
//    //char str[60] = {0};
//
//    
//    //fgets(str,60,fp);
//    //for(int i =0;i < 60;i++)
//    //{
//    //    printf("%c",str[i]);
//    //}
//
//    char buffer[100];
//    while(fgets(buffer,sizeof buffer, fp) != NULL)
//    {//fgets默认会给读到的字符末尾添加一个'\0',因为这是C语言。
//        //fgets是C语言的函数，一般都会添加'\0'
//        buffer[strlen(buffer)-1] = 0;
//        puts(buffer);
//    }
//    //char buffer[100];
//    //fgets(buffer, 100, fp);
//    //printf("%s",buffer);
//
//    return 0;
//}
//
//int main()
//{
//    FILE* fp = fopen("test.txt", "w");
//    if(fp ==NULL) exit(1);
//    fclose(fp);
//    //在C语言中，如果我们只是以w方式打开，其他什么都不做，文件会被清空。
//    
//    return 0;
//}


//一个宏对应一个比特位，彼此不重叠
//#define ONE 1
//#define TWO (1<<1)
//#define THREE (1<<2)
//#define FOUR (1<<3)
//
//
//void fun(int flags){
//    if(flags & ONE) printf("one\n");
//    if(flags & TWO) printf("two\n");
//    if(flags & THREE) printf("three\n");
//    if(flags & FOUR) printf("four\n");
//}
//int main()
//{
//    fun(ONE);
//    printf("---------------------\n");
//    fun(ONE|TWO);
//    printf("---------------------\n");
//    fun(ONE|TWO|THREE);
//    printf("---------------------\n");
//    fun(ONE|TWO|THREE|FOUR);
//    return 0;
//}
//



